package com.xj.config;

import com.xj.bean.Red;
import com.xj.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 自动装配：
 *      spring利用依赖注入（DI），完成对IOC容器中各个组件的依赖关系赋值
 * 1、@Autowired: 自动注入
 *      默认优先按照类型去容器中找对应的组件
 *      如果相同类型的有多个，就可以通过name来指定，或者   2
 * 2、spring还支持@Resource（JSR250）和@Inject（JSR330）【java规范注解】
 *      @Resource 默认是按照组件名称进行装配不支持@primary，不支持（required=false）
 *      @Inject: 需要导入javax.inject包和Autowired的功能一样。没有required=false功能
 *  AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能；
 *  3、@Autowired 构造方法，setter，有参构造器，放在参数位置，
 *      如果构造器只有一个有参构造器，那么有参构造器的@Autowired可以省略
 *  @Bean标注的方法，创建对象是，参数从ioc容器获取
 * 4、自定义组件想要使用Spring容器的一些底层功能，要实现***Aware接口
 *          ApplicationContextAwareProcessor为spring定义的一些Aware接口口实现参数输入
 *
 * @author xujiang
 * @date 2021/1/27 0:32
 */
@Configuration
@ComponentScan({"com.xj.service","com.xj.dao", "com.xj.bean", "com.xj.controller"})
public class MainConfigOfAutowired {

    @Bean("bookDao2")
    public BookDao bookDao() {
        BookDao bookDao = new BookDao();
        bookDao.setLable("2");
        return bookDao;
    }

    @Bean
    public Red red() {
        return new Red();

    }
}
